package tasks

import (
	"fmt"

	"torler.com/qingyue/apps/spider/internal/core/task"
	"torler.com/qingyue/common/model"
	"torler.com/qingyue/common/types"
)

const (
	RUNNER_PUBLISH_SPIDER_BOOK_CHANNEL = types.RunnerName("publish_spider_book_channel_task")
	TASK_PUBLISH_SPIDER_BOOK_CHANNEL   = types.TaskName("发布渠道小说爬虫任务")
)

// 发布渠道小说爬虫任务
//
// 功能：
//   - 获取所有需要进行抓取的渠道小说
//   - 发布需要进行小说信息和章节抓取的任务
//   - 发布需要章进行章节抓取的任务
type PublishBookChannelSpiderTask struct {
}

func NewPublishBookChannelSpiderTask() *PublishBookChannelSpiderTask {
	return &PublishBookChannelSpiderTask{}
}

// 任务执行者预加载
func (it *PublishBookChannelSpiderTask) Preload(t *task.Task) error {
	return nil
}

// 任务执行者的唯一名称标识用于反序列化
func (it *PublishBookChannelSpiderTask) Name() types.RunnerName {
	return RUNNER_PUBLISH_SPIDER_BOOK_CHANNEL
}

// 任务执行者
func (it *PublishBookChannelSpiderTask) Run(tsk *task.Task) error {
	db := tsk.GetCtx().DB

	//从最近更新列表中获取需要抓取的小说
	var lastBooks []*model.LastestCBook
	db.Model(&model.LastestCBook{}).Where("sched = ?", false).Find(&lastBooks)
	for _, book := range lastBooks {
		taskName := fmt.Sprintf("%s_%d_%d", TASK_SPIDER_CBOOK, book.SiteId, book.OId)
		//发布小说信息抓取任务
		t := task.NewTask(tsk.GetCtx(), types.TaskName(taskName), RUNNER_SPIDER_CBOOK,
			task.WithRunModeOnce(),
			task.WithParam("oid", book.OId),
			task.WithParam("site_id", book.SiteId))
		book.Sched = true
		tsk.TaskManager().AddTask(t)

	}
	if len(lastBooks) == 0 {
		return nil
	}
	return db.Save(lastBooks).Error

}
